home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / share / doc / libcairo-perl / examples / png / outline.pl < prev    next >
Encoding:
Perl Script  |  2005-07-12  |  2.1 KB  |  113 lines

  1. #!/usr/bin/perl
  2.  
  3. use strict;
  4. use warnings;
  5. use Cairo;
  6.  
  7. use constant
  8. {
  9.     WIDTH => 750,
  10.     HEIGHT => 500,
  11. };
  12.  
  13. {
  14.     my $surf = Cairo::ImageSurface->create ('argb32', WIDTH, HEIGHT);
  15.     my $cr = Cairo::Context->create ($surf);
  16.  
  17.     $0 =~ /(.*)\.pl/;
  18.     my $out = "$1.png";
  19.  
  20.     $cr->rectangle (0, 0, WIDTH, HEIGHT);
  21.     $cr->set_source_rgb (1, 1, 1);
  22.     $cr->fill;
  23.  
  24.     draw_outlines ($cr, WIDTH, HEIGHT);
  25.  
  26.     $cr->show_page;
  27.  
  28.     $surf->write_to_png ($out);
  29. }
  30.  
  31. sub create_gradient
  32. {
  33.     my ($cr, $width, $height) = @_;
  34.  
  35.     my $gradient = Cairo::LinearGradient->create (0, 0, $width, 0);
  36.  
  37.     $gradient->add_color_stop_rgb (0.0, 0., 0., 0.);
  38.     $gradient->add_color_stop_rgb (0.5, 1., 1., 1.);
  39.     $gradient->add_color_stop_rgb (1.0, 0., 0., 0.);
  40.  
  41.     return $gradient;
  42. }
  43.  
  44. sub draw_outlines
  45. {
  46.     my ($cr, $surface_width, $surface_height) = @_;
  47.  
  48.     my $gradient;
  49.     my ($width, $height, $pad);
  50.  
  51.     $width = $surface_width / 4.0;
  52.     $pad = ($surface_width - (3 * $width)) / 2.0;
  53.     $height = $surface_height;
  54.  
  55.     $gradient = create_gradient ($cr, $width, $height);
  56.  
  57.     $cr->set_source ($gradient);
  58.     draw_flat ($cr, $width, $height);
  59.  
  60.     $cr->translate ($width + $pad, 0);
  61.     $cr->set_source ($gradient);
  62.     draw_tent ($cr, $width, $height);
  63.  
  64.     $cr->translate ($width + $pad, 0);
  65.     $cr->set_source ($gradient);
  66.     draw_cylinder ($cr, $width, $height);
  67.  
  68.     $cr->restore;
  69. }
  70.  
  71. sub draw_flat
  72. {
  73.     my ($cr, $width, $height) = @_;
  74.  
  75.     my $hwidth = $width / 2.0;
  76.  
  77.     $cr->rectangle (0, $hwidth, $width, $height - $hwidth);
  78.  
  79.     $cr->fill;
  80. }
  81.  
  82. sub draw_tent
  83. {
  84.     my ($cr, $width, $height) = @_;
  85.  
  86.     my $hwidth = $width / 2.0;
  87.  
  88.     $cr->move_to     (       0,  $hwidth);
  89.     $cr->rel_line_to ( $hwidth, -$hwidth);
  90.     $cr->rel_line_to ( $hwidth,  $hwidth);
  91.     $cr->rel_line_to (       0,  $height - $hwidth);
  92.     $cr->rel_line_to (-$hwidth, -$hwidth);
  93.     $cr->rel_line_to (-$hwidth,  $hwidth);
  94.     $cr->close_path;
  95.  
  96.     $cr->fill;
  97. }
  98.  
  99. sub draw_cylinder
  100. {
  101.     my ($cr, $width, $height) = @_;
  102.  
  103.     my $hwidth = $width / 2.0;
  104.  
  105.     $cr->move_to (0, $hwidth);
  106.     $cr->rel_curve_to (0, -$hwidth, $width, -$hwidth, $width, 0);
  107.     $cr->rel_line_to (0, $height - $hwidth);
  108.     $cr->rel_curve_to (0, -$hwidth, -$width, -$hwidth, -$width, 0);
  109.     $cr->close_path;
  110.  
  111.     $cr->fill;
  112. }
  113.